#include "Scene.h"
#include "Vue.h"

void Scene_amorcer() {}
void Scene_init() {}

void Scene_Tour_Suivant(t_liste* pRattaupe, t_motte** pMotte, SDL_Surface* ecran){
	//S'occupe du dÃ©placement des rattaupes Ã  chaque tour
	int eRattaupesNb=1;
	int ePosX, ePosY;

	t_rattaupes Rattaupe;
	t_rattaupes RattaupeMere;
	RattaupeMere.ePosX=0;

	char *sCommande=(char*)malloc(sizeof(char));
	char Deplacement[100] = "";
	char DeplacementPos[80] = "";
	char Procreation[70] = "";
	char Sante[15] = "";
	char Suivre[70] = "";
	char Grandir[70] = "";

	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;

	en_tete(pRattaupe);

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		Rattaupe_Focus(ecran, Rattaupe);
		ePosX=Rattaupe.ePosX;
		ePosY=Rattaupe.ePosY;
		SDL_Rect_Blanc(ecran,SDL_Clean, 15, 310, 0, HAUTEUR_FENETRE+35); // DÃ©placement
		SDL_Rect_Blanc(ecran,SDL_Clean, 20, 85, LARGEUR_FENETRE-85, HAUTEUR_FENETRE); // SantÃ©
		SDL_Rect_Blanc(ecran,SDL_Clean, 15, 345, 5, HAUTEUR_FENETRE+55); // Gestation
    		SDL_Flip(ecran);
		if(Rattaupe.Age==Adulte){
			RattaupeMere=Rattaupe;
			if(bDeplacement_possible(pMotte,ePosX,ePosY)){
				if(Rattaupe.Sexe==Male){
					sprintf(Deplacement, "Entrez le dÃ©placement de votre taupe mÃ¢le nÂ°%i",eRattaupesNb,ePosX,ePosY);
					SDL_Ecrire(ecran, SDL_Texte, 100, Deplacement, 5, HAUTEUR_FENETRE+35);
				}
				else {
					sprintf(Deplacement, "Entrez le dÃ©placement de votre taupe femelle nÂ°%i",eRattaupesNb,ePosX,ePosY);
					SDL_Ecrire(ecran, SDL_Texte, 100, Deplacement, 5, HAUTEUR_FENETRE+35);
				}

				if(Rattaupe.Sexe==Femelle){
					sprintf(Procreation, "Temps avant de pouvoir procrÃ©er : %i tours",6-Rattaupe.eDelaiGrossesse);
					SDL_Ecrire(ecran, SDL_Texte, 70, Procreation, 5, HAUTEUR_FENETRE+55);
				}

				sprintf(Sante, "Sante : %i%%",Rattaupe.eSante);
				SDL_Ecrire(ecran, SDL_Texte, 15, Sante, LARGEUR_FENETRE-80, HAUTEUR_FENETRE+5);
				SDL_Flip(ecran);

				sCommande=sDeplacEcrire(sCommande);
				while(!bDeplacement_possible_dir(pMotte,ePosX,ePosY,sCommande)){
					sprintf(DeplacementPos, "DÃ©placement impossible");
					SDL_Ecrire(ecran, SDL_Texte, 80, DeplacementPos, LARGEUR_FENETRE-150, HAUTEUR_FENETRE+55);
					SDL_Flip(ecran);

					sCommande=sDeplacEcrire(sCommande);

					SDL_Rect_Blanc(ecran,SDL_Clean, 20, 140, LARGEUR_FENETRE-150, HAUTEUR_FENETRE+55);//DÃ©placement impossible
					SDL_Flip(ecran);
				}
				Rattaupes_deplacement(pRattaupe, pMotte, ePosX, ePosY, sCommande, ecran);
			}
			else {
				sprintf(Deplacement, "Votre taupe ne peut pas bouger",eRattaupesNb,ePosX,ePosY);
				SDL_Ecrire(ecran, SDL_Texte, 100, Deplacement, LARGEUR_FENETRE-180, HAUTEUR_FENETRE+55);
				SDL_Flip(ecran);

				SDL_Delay(3000);
				SDL_Rect_Blanc(ecran,SDL_Clean, 20, 180, LARGEUR_FENETRE-180, HAUTEUR_FENETRE+55);//Taupe peut pas bouger
				SDL_Flip(ecran);
				}
		}
		else {
			pMotte[ePosX][ePosY].eTaupes-=1;
			//On vÃ©rifie ici si la mÃ¨re n'est pas morte en vÃ©rifiant si elle est autour du Rattaupe et juste avant dans la liste
			if(RattaupeMere.ePosX!=0&&RattaupeMere.eDelaiGrossesse<=3&&RattaupeMere.Age==Adulte&&RattaupeMere.Sexe==Femelle&&((RattaupeMere.ePosX==ePosX&&RattaupeMere.ePosY==ePosY)||((RattaupeMere.ePosX==ePosX+1||RattaupeMere.ePosX==ePosX-1||RattaupeMere.ePosX==ePosX)&&(RattaupeMere.ePosY==ePosY+1||RattaupeMere.ePosY==ePosY-1||RattaupeMere.ePosY==ePosY)))){
				sprintf(Suivre, "Votre jeune taupe (%i,%i) va suivre sa mÃ¨re",ePosX,ePosY);
				SDL_Ecrire(ecran, SDL_Texte, 70, Suivre, 5, HAUTEUR_FENETRE+35);
				
				pMotte[RattaupeMere.ePosX][RattaupeMere.ePosY].eTaupes+=1;
				Rattaupe.ePosX=RattaupeMere.ePosX;
				Rattaupe.ePosY=RattaupeMere.ePosY;
				modif_elt(pRattaupe,Rattaupe);

				sprintf(Grandir, "Encore %i tours avant que votre jeune taupe ne devienne adulte",4-Rattaupe.eGestation);
				SDL_Ecrire(ecran, SDL_Texte, 70, Grandir, 5, HAUTEUR_FENETRE+55);
				SDL_Flip(ecran);
			}
			else {
				sprintf(Grandir, "La mÃ¨re du petit est morte, il ne peut survivre seul !");
				SDL_Ecrire(ecran, SDL_Texte, 70, Grandir, 5, HAUTEUR_FENETRE+35);
				SDL_Flip(ecran);
				oter_elt(pRattaupe);
			}
		SDL_Delay(2000);
		}
		Vue_afficher(pMotte,ecran);
		SDL_Flip(ecran);
		eRattaupesNb++;
		suivant(pRattaupe);
	}

	//free(sCommande);
}

char* sDeplacEcrire (char *sCommande){
	SDL_Event event;
	SDL_Rect positionMenu;
	int continuer = 1;

	positionMenu.x = 0;
	positionMenu.y = 0;

	while (continuer)
	{
		SDL_WaitEvent(&event);
		switch(event.type)
		{
			case SDL_QUIT:
				exit(0);
				break;
			case SDL_KEYDOWN:
				switch(event.key.keysym.sym)
				{
					case SDLK_ESCAPE:
						continuer = 0;
						break;
					case SDLK_UP:
						sCommande="haut";
						continuer=0;
						break;
					case SDLK_DOWN:
						sCommande="bas";
						continuer=0;
						break;
					case SDLK_RIGHT:
						sCommande="droite";
						continuer=0;
						break;
					case SDLK_LEFT:
						sCommande="gauche";
						continuer=0;
						break;
					case SDLK_SPACE:
						sCommande="vide";
						continuer=0;
						break;
				}
			   break;
		}
	}

	return sCommande;
}

int bDeplacement_possible(t_motte** pMotte, int ePosX, int ePosY){
	//Regarde si le rattaupe peut se dÃ©placer ou non
	if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre)	return 1;

	return 0;
}

int bDeplacement_possible_dir(t_motte** pMotte, int ePosX, int ePosY, char* sCommande){
	//VÃ©rifie que le dÃ©placement demandÃ© par l'utilisateur est possible
	if(strcmp(sCommande,"haut")==0){
		if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"bas")==0){
		if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"gauche")==0){
		if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"droite")==0){
		if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"vide")==0){
		return 1;
	}
	return 0;
}

void Rattaupes_deplacement(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, char* sCommande, SDL_Surface* ecran){
	//S'occupe de dÃ©placer le rattaupe en fonction de la demande de l'utilisateur
	pMotte[ePosX][ePosY].eTaupes-=1;
	t_rattaupes Rattaupe;
	valeur_elt(pRattaupe,&Rattaupe);

	if(strcmp(sCommande,"haut")==0){
		ePosX-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
		
	}
	else if (strcmp(sCommande,"bas")==0){
		ePosX+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"gauche")==0){
		ePosY-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"droite")==0){
		ePosY+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	

	else if (strcmp(sCommande,"vide")==0){
		Rattaupe.eSante+=10;
	}

	modif_elt(pRattaupe,Rattaupe);
	pMotte[ePosX][ePosY].eTaupes+=1;
	Rattaupes_absorption(pRattaupe, pMotte, ePosX, ePosY, ecran);
}

void Rattaupes_absorption(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, SDL_Surface* ecran){
	//S'occupe de l'absorption des mottes de terre par les dÃ©placements des rattaupes
	if(pMotte[ePosX][ePosY].eEtatterre!=Pierre&&pMotte[ePosX][ePosY].eEtatterre!=Rien){
		switch (pMotte[ePosX][ePosY].eEtatterre){
			case Plein : 	pMotte[ePosX][ePosY].eEtatterre=Moyen;
					break;
			case Moyen :	pMotte[ePosX][ePosY].eEtatterre=Petit;
					break;
			case Petit : 	pMotte[ePosX][ePosY].eEtatterre=Rien;
					break;
		}
		Nourriture_absorption(pRattaupe, pMotte, ePosX, ePosY, ecran);
	}
}

void Nourriture_absorption (t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, SDL_Surface* ecran){
	//S'occupe de l'absorption de la nourriture lors des dÃ©placements des rattaupes + supprime la nourriture ingÃ©rÃ©e et sante Ã  100%
	t_rattaupes Rattaupe;
	valeur_elt(pRattaupe,&Rattaupe);
	char Nourrir[70] = "";

	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;

	SDL_Rect_Blanc(ecran,SDL_Clean, 15, 190, LARGEUR_FENETRE-200, HAUTEUR_FENETRE+25);
		if(pMotte[ePosX][ePosY].Nourriture!=Vide){
		switch(pMotte[ePosX][ePosY].Nourriture){
			case Ver : sprintf(Nourrir, " Votre taupe a manger un ver"); Rattaupe.eSante+=40; break;
			case Plante : sprintf(Nourrir, " Votre taupe a manger une plante"); Rattaupe.eSante+=20; break;
			case Poison : sprintf(Nourrir, " Votre taupe a été empoisonné"); Rattaupe.eSante-=20; break;
			case Vivifiant : sprintf(Nourrir, " Votre taupe a manger un vivifiant"); Rattaupe.eSante+=60; break;
			case Non_comestible : sprintf(Nourrir, " Votre taupe a manger une plante non comestible"); Rattaupe.eSante-=10; break;
			case Plante_seche : sprintf(Nourrir, " Votre taupe a manger une plante seche");Rattaupe.eSante+=10; break;
			default : break;
		}

		
		pMotte[ePosX][ePosY].Nourriture=Vide;
		pMotte[ePosX][ePosY].ptNourriture=0;
		modif_elt(pRattaupe,Rattaupe);
	}

	SDL_Ecrire(ecran, SDL_Texte, 70, Nourrir, LARGEUR_FENETRE-200, HAUTEUR_FENETRE+25);
	SDL_Flip(ecran);

}

void Sante_decremente (t_liste* pRattaupe, int eTour){
	//DÃ©crÃ©mente la santÃ© du rattaupe de 20% Ã  chaque tour sauf 33% si grossesse en cours
	en_tete(pRattaupe);

	t_rattaupes Rattaupe;

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.Age==Adulte){
			if(Rattaupe.eSante>0){
				if(Rattaupe.eGestation>0||(Rattaupe.eDelaiGrossesse<3&&eTour>=6&&Rattaupe.Sexe==Femelle)){
					if(Rattaupe.eSante==33)
						Rattaupe.eSante=0;
					else
						Rattaupe.eSante-=33;
				}
				else {
					Rattaupe.eSante-=20;
				}
				modif_elt(pRattaupe,Rattaupe);
			}
		}
		suivant(pRattaupe);
	}
}

void Mort_Rattaupe (t_motte** pMotte, t_liste* pRattaupe, SDL_Surface* ecran){
	//Tue un rattaupe quand sa santÃ© est Ã  0%
	en_queue(pRattaupe);
	char Mort[60] = "";
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;

	t_rattaupes Rattaupe;	
	int eRattaupeMort = 0;

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.eSante<=0){
			pMotte[Rattaupe.ePosX][Rattaupe.ePosY].eTaupes-=1;
			eRattaupeMort ++;
			oter_elt(pRattaupe);
		}
		else precedent(pRattaupe);
	}
	if(eRattaupeMort==1)
        sprintf(Mort, "%i de vos rattaupes est mort !", eRattaupeMort);
	if(eRattaupeMort>1)
        sprintf(Mort, "%i de vos rattaupes sont morts !", eRattaupeMort);

	if(eRattaupeMort>0)	{
		SDL_Rect_Blanc(ecran,SDL_Clean, ESPACE_MENU-35, LARGEUR_FENETRE, 0, HAUTEUR_FENETRE+35);//Vidage quasi entier du menu
		SDL_Rect_Blanc(ecran,SDL_Clean, ESPACE_MENU, 190, LARGEUR_FENETRE-190, HAUTEUR_FENETRE);
		SDL_Flip(ecran);
		SDL_Ecrire(ecran, SDL_Texte, 60, Mort, 5, HAUTEUR_FENETRE+35);
		SDL_Flip(ecran);
		SDL_Delay(2000);
	}
	Vue_afficher(pMotte,ecran);

}

void Nourriture_decremente(t_motte** pMotte){
	//DÃ©cremente l'Ã©tat de la nourriture Ã  chaque tour
	int eLigne, eColonne;
	for(eLigne=1;eLigne<elmax-1;eLigne++){
		for(eColonne=1;eColonne<ecmax-1;eColonne++){
			switch(pMotte[eLigne][eColonne].ptNourriture){
				case 40 : pMotte[eLigne][eColonne].ptNourriture-=40;
				case 70 : pMotte[eLigne][eColonne].ptNourriture-=30;
				case 100 : pMotte[eLigne][eColonne].ptNourriture-=30;

			}
			if(pMotte[eLigne][eColonne].ptNourriture==0)
				pMotte[eLigne][eColonne].Nourriture=Vide;
		}
	}
}

void Enceinte_incremente (t_liste* pRattaupe, int eTour){
	t_rattaupes Rattaupe;

	en_tete(pRattaupe);
	if(eTour!=0){ // Pas d'incrÃ©mentation Ã  l'initialisation
		while(!hors_liste(pRattaupe)){
			valeur_elt(pRattaupe,&Rattaupe);
			//Si le sexe est Male et Age est Adulte et DelaiGrossesse <6
			if(Rattaupe.Sexe==Femelle&&Rattaupe.Age==Adulte&&Rattaupe.eDelaiGrossesse<6){
				Rattaupe.eDelaiGrossesse++;
				modif_elt(pRattaupe,Rattaupe);
			}
			if(Rattaupe.Sexe==Femelle&&Rattaupe.Age==Adulte&&Rattaupe.eGestation>0){
				Rattaupe.eGestation--;
				modif_elt(pRattaupe,Rattaupe);
			}
			suivant(pRattaupe);
		}
	}
}

void Rattaupe_Grandis(t_liste* pRattaupe){
	t_rattaupes Rattaupe;

	en_tete(pRattaupe);
	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.Age==Jeune){
			if(Rattaupe.eGestation==3){
				Rattaupe.Age=Adulte;
				Rattaupe.eGestation=0;
				Rattaupe.eDelaiGrossesse=0;
				modif_elt(pRattaupe,Rattaupe);
			}
			else{
				Rattaupe.eGestation+=1;
				modif_elt(pRattaupe,Rattaupe);
			}
		}
		suivant(pRattaupe);
	}
}